﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using LinqKit;
using GestionePolveriLib.BL.Filters;
using ControlsLib;
using System.Linq.Expressions;
using FrameworkLib.Filters;
using FrameworkLib.Facades.Paging;
using FrameworkLib.Facades;
using System.Data.Objects;
using GestionePolveriLib.Facades.Extensions;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class MovimentiPagedFacade : PagedFacadeBase<GestionePolveriEntities>
    {
        public MovimentiPagedFacade(int pageSize) : base(pageSize)
        {

        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetMovimenti(), callback);
        }

        public void LoadAsyncS(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetMovimenti(), callback);
        }

        private Movimento2 ProjectData(Movimenti obj)
        {
            Movimento2 retValue = null;

            retValue = new Movimento2
                      {
                          IDMovimento = obj.IDMovimento,
                          DataMovimento = obj.DataMovimento,
                          IDCausale = obj.IDCausale,
                          CodCausale = obj.CausaliMagazzino.CodCausale,
                          NumDdt = obj.Lotti.NumDdt,
                          DataDdt = obj.Lotti.DataDdt,

                          IDPolvere = obj.IDPolvere,
                          CodicePolvere = obj.AnagPolveri.CodicePolvere,
                          CodicePolvere_old = obj.AnagPolveri.CodicePolvere,
                          DescrizionePolvere = obj.AnagPolveri.Descrizione,

                          IDFamiglia = obj.IDFamiglia,
                          Famiglia = obj.AnagFamiglie.Descrizione,

                          IDFormato = obj.IDFormato,
                          Formato = obj.FormatoScatole.Formato,
                          Pezzatura = obj.FormatoScatole.Pezzatura,

                          NumScatole = obj.NumScatole,
                          Quantita = obj.Quantita,
                          Quantita_old = obj.Quantita,

                          //
                          GiacenzaFinale = obj.Lotti.Giacenza,

                          //ValoreFinale = x.Lotti.Valore,
                          ValoreFinale = obj.Lotti.Giacenza * obj.Lotti.PrezzoUnitario,
                          GiacenzaIniziale = obj.Lotti.Giacenza_iniziale,

                          //Giacenza = x.Giacenza,
                          //Valore = x.Valore,

                          NumFattura = obj.Lotti.NumFattura,
                          DataFattura = obj.Lotti.DataFattura,

                          Note = obj.Note,
                          NotePolvere = obj.AnagPolveri.Note,

                          IDOperatore = obj.IDOperatore,
                          Operatore = obj.aspnet_Users.UserName,

                          IDLotto = obj.IDLotto,
                          IDLotto_old = obj.IDLotto,
                          CodiceLotto = obj.Lotti.CodLotto,
                          CodiceLotto_old = obj.Lotti.CodLotto,

                          DataScadenzaLotto = obj.Lotti.DataScadenzaLotto,
                          IDImpianto = obj.IDImpianto,
                          Impianto = obj.Impianti.Impianto,

                          PrezzoUnitario = obj.Lotti.PrezzoUnitario,
                          CausaleScarico = obj.CausaliScarico.CodCausaleScarico,
                          SottoScortaFlag = obj.Sottoscorta,
                          GiacenzaInsufficienteFlag = obj.GiacenzaNegativa
                      };

            return retValue;
        }

        public List<Movimento2> Getprova()
        {
            List<Movimento2> retValue = null;

            GestionePolveriEntities m_context = this.GetContext();

            var obj = m_context.Movimenti.Where(x => !x.IsDeleted).OrderBy(x => x.IDMovimento).Select(x => ProjectData(x));

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Movimento2> GetMovimenti(FilterBase<Movimenti> filter)
        {
            List<Movimento2> retValue = null;

            GestionePolveriEntities m_context = this.GetContext();

            var obj = (from x in m_context.Movimenti.AsExpandable().Where(filter.SetUpFilter())
                       //join y in m_context.CausaliMagazzino on x.IDCausale equals y.IDCausale
                       where !x.IsDeleted
                       orderby x.IDMovimento descending
                       select new Movimento2
                       {
                           IDMovimento = x.IDMovimento,
                           DataMovimento = x.DataMovimento,
                           IDCausale = x.IDCausale,
                           CodCausale = x.CausaliMagazzino.CodCausale,
                           NumDdt = x.Lotti.NumDdt,
                           DataDdt = x.Lotti.DataDdt,

                           IDPolvere = x.IDPolvere,
                           CodicePolvere = x.AnagPolveri.CodicePolvere,
                           CodicePolvere_old = x.AnagPolveri.CodicePolvere,

                           IDFamiglia = x.IDFamiglia,
                           Famiglia = x.AnagFamiglie.Descrizione,

                           IDFormato = x.IDFormato,
                           Formato = x.FormatoScatole.Formato,
                           Pezzatura = x.FormatoScatole.Pezzatura,

                           NumScatole = x.NumScatole,
                           Quantita = x.Quantita,
                           Quantita_old = x.Quantita,

                           GiacenzaFinale = x.Lotti.Giacenza,

                           //ValoreFinale = x.Lotti.Valore,
                           ValoreFinale = x.Lotti.Giacenza * x.Lotti.PrezzoUnitario,
                           GiacenzaIniziale = x.Lotti.Giacenza_iniziale,

                           //Giacenza = x.Giacenza,
                           //Valore = x.Valore,
                           

                           NumFattura = x.Lotti.NumFattura,
                           DataFattura = x.Lotti.DataFattura,

                           Note = x.Note,
                           NotePolvere=x.AnagPolveri.Note,

                           IDOperatore = x.IDOperatore,
                           Operatore = x.aspnet_Users.UserName,

                           IDLotto = x.IDLotto,
                           IDLotto_old = x.IDLotto,
                           CodiceLotto = x.Lotti.CodLotto,
                           CodiceLotto_old = x.Lotti.CodLotto,

                           DataScadenzaLotto = x.Lotti.DataScadenzaLotto,
                           IDImpianto = x.IDImpianto,
                           Impianto = x.Impianti.Impianto,

                           PrezzoUnitario = x.Lotti.PrezzoUnitario,
                           CausaleScarico = x.CausaliScarico.CodCausaleScarico,
                           SottoScortaFlag = x.Sottoscorta,
                           GiacenzaInsufficienteFlag = x.GiacenzaNegativa
                       }).Skip(base.Skip).Take(base.PageSize);

            //string pppp = ((ObjectQuery)obj).ToTraceString(); 

            if (obj.Any())
            {
                retValue = obj.ToList();

                List<LookUp_FamiglieColori_ColoriAbbinati_Result> mmm = (List<LookUp_FamiglieColori_ColoriAbbinati_Result>)FrameworkLib.Utilities.Singleton<GestionePolveriLib.Cache.LookUpData>.Instance.GetData("LookupFamiglie");
                foreach (Movimento2 p in retValue)
                {
                    LookUp_FamiglieColori_ColoriAbbinati_Result r = mmm.Find(x => x.IDPolvere == p.IDPolvere);

                    p.Famiglia = r.Famiglia;
                    p.ColoriAbbinati = r.ColoriAbbinati;
                }
            }

            return retValue;
        }

        public List<Movimento2> GetMovimenti()
        {
            List<Movimento2> retValue = null;

            GestionePolveriEntities m_context = this.GetContext();

            var obj = (from x in m_context.Movimenti
                      //join y in m_context.CausaliMagazzino on x.IDCausale equals y.IDCausale
                      where !x.IsDeleted
                      orderby x.IDMovimento descending
                      select new Movimento2
                      {
                          IDMovimento = x.IDMovimento,
                          DataMovimento = x.DataMovimento,
                          IDCausale = x.IDCausale,
                          CodCausale = x.CausaliMagazzino.CodCausale,
                          NumDdt = x.Lotti.NumDdt,
                          DataDdt = x.Lotti.DataDdt,

                          IDPolvere = x.IDPolvere,
                          CodicePolvere = x.AnagPolveri.CodicePolvere,
                          CodicePolvere_old = x.AnagPolveri.CodicePolvere,
                          DescrizionePolvere = x.AnagPolveri.Descrizione,                          

                          IDFamiglia = x.IDFamiglia,
                          Famiglia = x.AnagFamiglie.Descrizione,

                          IDFormato = x.IDFormato,
                          Formato = x.FormatoScatole.Formato,
                          Pezzatura = x.FormatoScatole.Pezzatura,

                          NumScatole = x.NumScatole,
                          Quantita = x.Quantita,
                          Quantita_old = x.Quantita,

                          //
                          GiacenzaFinale = x.Lotti.Giacenza,

                          //ValoreFinale = x.Lotti.Valore,
                          ValoreFinale = x.Lotti.Giacenza * x.Lotti.PrezzoUnitario,
                          GiacenzaIniziale = x.Lotti.Giacenza_iniziale,

                          //Giacenza = x.Giacenza,
                          //Valore = x.Valore,

                          NumFattura = x.Lotti.NumFattura,
                          DataFattura = x.Lotti.DataFattura,

                          Note = x.Note,
                          NotePolvere = x.AnagPolveri.Note,

                          IDOperatore = x.IDOperatore,
                          Operatore = x.aspnet_Users.UserName,

                          IDLotto = x.IDLotto,
                          IDLotto_old = x.IDLotto,
                          CodiceLotto = x.Lotti.CodLotto,
                          CodiceLotto_old = x.Lotti.CodLotto,

                          DataScadenzaLotto = x.Lotti.DataScadenzaLotto,
                          IDImpianto = x.IDImpianto,
                          Impianto = x.Impianti.Impianto,

                          PrezzoUnitario = x.Lotti.PrezzoUnitario,
                          CausaleScarico = x.CausaliScarico.CodCausaleScarico,
                          SottoScortaFlag = x.Sottoscorta,
                          GiacenzaInsufficienteFlag = x.GiacenzaNegativa
                      }).Skip(base.Skip).Take(base.PageSize);

            if (obj.Any())
            {
                retValue = obj.ToList();

                List<LookUp_FamiglieColori_ColoriAbbinati_Result> mmm = (List<LookUp_FamiglieColori_ColoriAbbinati_Result>)FrameworkLib.Utilities.Singleton<GestionePolveriLib.Cache.LookUpData>.Instance.GetData("LookupFamiglie");
                if (mmm != null)
                {
                    foreach (Movimento2 p in retValue)
                    {
                        LookUp_FamiglieColori_ColoriAbbinati_Result r = mmm.Find(x => x.IDPolvere == p.IDPolvere);

                        p.Famiglia = r.Famiglia;
                        p.ColoriAbbinati = r.ColoriAbbinati;
                    }
                }
            }

            return retValue;
        }

        public double GetTotaleMovimenti(string tipoMovimento)
        {
            double retValue = 0;

            try
            {
                retValue = (from x in this.GetContext().Movimenti
                            where x.CausaliMagazzino.CodCausale == tipoMovimento
                            select x).Sum(x => x.Quantita);
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public void GetNumberOfPages()
        {
            this.CalcNumberOfPages((from x in this.GetContext().Movimenti where !x.IsDeleted select x).Count());
        }

        public void GetNumberOfPages(FilterBase<Movimenti> filter)
        {
            base.UseFiltering = true;
            base.PageNumber = 1;
            Expression<Func<Movimenti, bool>> theFilter = filter.SetUpFilter();
            this.CalcNumberOfPages((from x in this.GetContext().Movimenti.AsExpandable().Where(theFilter) where !x.IsDeleted select x).Count());
        }
    }
}
